//导入axios
import axios from 'axios'

//导入message提示信息
import { Message } from 'element-ui'

//导入获取token的方法
import { getToken, getTimeStemp } from '@/utils/auth'

//创建Instance实例
const instance = axios.create({
  baseURL:'/api'
})

//导入store
import store from '@/store'
//导入路由
import router from '@/router/index'

//设置一个token过期的时间点,即30分钟
const timeOut = 300 * 60 * 1000

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    //存token
    const token = getToken()
    if (token) {
      //(1)先得到当前的时间
      const timeNow = Date.now()
      //(2)再获取到使用Token时的时间戳
      const tokenTiemstemp = getTimeStemp()
      //(3)拿当前的时间 - 时间token的时间戳
      const timeToken = timeNow - tokenTiemstemp
      //(4)拿时间差与事先设置好的超时时间进行对比，如果大于超时时间，就代表Token过期了， 此时就需要登出
      if (timeToken >= timeOut) {
        store.dispatch('user/logOut')
        //提示
        Message.info('token已超时，请您重新登录')
        //跳转到登录页面
        const path = window.location.href.split('#')[1]
        router.push(`/login?_redirect=${path}`)
        return Promise.reject(new Error('Token超时'))
      }
      //设置请求头
      config.headers.Authorization = `Bearer ${token}`
    }
    // 在发送请求之前做些什么
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    //判断登录状态是否成功
    if (response.data.success == true) {
      //如果登录成功就直接返回data
      return response.data
    } else {
      //如果登录失败，就先提示错误信息，再把错误信息抛出
      Message.error(response.data.message)
      return Promise.reject(new Error(response.data.message))
    }

    /* //(1)利用解构语法
    const {
      data: { success, message }
    } = response
    //(2)判断当前的请求解构是否为登录成功
    if (success) {
      return response.data
    } else {
       //如果登录失败，就先提示错误信息，再把错误信息抛出
      Message.error(message)
      return Promise.reject(new Error(message))
    } */
  },
  error => {
    //判断返回的状态码，如果是10002，就代表Token超时，此时就需要删除token,同时跳转到登录页重新进行登录
    //error 信息 里面 response的对象
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      //删除token
      store.dispatch('user/logOut')
      //给出超时提示
      Message.info('登录超时，请重新进行登录')
      //跳转回登录页重新进行登录，然后重新登入后获取到新的Token,此时就需要返回到用户当时操作的页面
      router.push(`/login?_redirect=${window.location.href.split('#')[1]}`)
    }
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

//到处instance
export default instance
